<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 抽象工厂模式是工厂方法模式的泛化版本，工厂方法模式是一致特殊的工厂模式。在工厂方法模式中，一个具体工厂只能生产一种产品，
    * 而抽象工厂模式中，一个具体工厂可以生产多个产品。
    *
    * 1.抽象工厂角色：工厂方法模式的核心。是具体工厂角色必须实现的接口或者必须继承的父类。
    * 2.具体工厂角色：含有和具体业务逻辑有关的代码。创建对应的具体产品的对象。
    * 3.抽象产品角色：是具体产品继承的父类或者是实现的接口。
    * 4.具体产品角色：具体工厂角色所创建的对象就是此类角色的实例。
    *
    * 使用场景：
    * 链接数据库产品  操作数据库产品
    * MOgodb工厂可以连接数据库也可以操作数据库
    * mysql工厂可以连接数据库也可以操作数据库
    *
    * */

    //抽象产品 电脑
    class Computer{
        //功能
        code(){

        }
    }

    //具体产品 电脑
    class Xiaomi_c extends Computer{
        code(){
            console.log("xiaomidiannao")
        }
    }

    class Dell_c extends Computer{
        code(){
            console.log("delldiannao")
        }
    }

    //抽象产品 手机
    class Phone{
        //功能
        call(){

        }
    }

    //具体产品 手机
    class Xiaomi_p extends Phone{
        call(){
            console.log("xiaomishouji")
        }
    }

    class Dell_p extends Phone{
        call(){
            console.log("dellshouji")
        }
    }

    //抽象工厂
    class CPFactory{
        //生产电脑的规则
        createComputer(){

        }

        //生产手机的规则
        createPhone(){

        }
    }

    //具体工厂
    class XiaomiFactory extends CPFactory{
        createComputer() {
            console.log("xiaomidiannao")
            return new Xiaomi_c()
        }
        createPhone() {
            console.log("xiaomishouji")
            return new Xiaomi_p()
        }
    }

    class DellFactory extends CPFactory{
        createComputer() {
            console.log("delldiannao")
            return new Dell_c()
        }
        createPhone() {
            console.log("dellshouji")
            return new Dell_p()
        }
    }

    //需要的时候直接实例具体工厂
    let xiaomi = new XiaomiFactory()
    xiaomi.createComputer().code() //小米工厂调用create电脑方法再调用code方法
    xiaomi.createPhone().call() //小米工厂调用create手机方法再调用call方法
</script>
</body>
</html>